iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1

之前介紹過Q-table,今天我們講的DQN就是AI跟Q-learning的結合。Q-table比DQN好收斂很多,畢竟state是已定義好的,不過就是因為DQN架構有著龐大參數的類神經網路做計算,使得state(例如畫面)不用固定,同樣可輸出action來操作遊戲。

輸入

輸入為前處理後輸出的影像,接著會依照順序疊四楨的畫面送進network。溫習下~畫面連續輸入才有著移動位置的認知,舉雷霆戰機的例子,連續的畫面的才能讓模型判斷射出的飛彈要飛一段時間才能命中敵艦。再舉個例子,我們開車也是連續感知前方的視野,才能很好的控制著方向盤。這裏我們先把畫面縮小成80x80,顏色降為灰白,除了減輕模型對於判斷的負擔,也減少不必要的額外計算開銷。

輸出

依照環境定義的動作數量,output就會有幾個。以小小恐龍案例來說動作僅有不跳跟跳,這兩個動作分別輸出一個值,兩者輸出的值我們會再取最大的做為執行動作。

網路結構

def buildmodel():
    model = Sequential()
    model.add(Conv2D(32, (8, 8), padding='same',strides=(4, 4),input_shape=(80,80,4))) #80*80*4
    model.add(MaxPooling2D(pool_size=(2,2))) # pool層,把模塊壓縮
    model.add(Activation('relu')) # 激活函數
    model.add(Conv2D(64, (4, 4),strides=(2, 2), padding='same')) # 卷積
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3),strides=(1, 1), padding='same'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Activation('relu'))
    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dense(2))
    adam = Adam(lr=1e-4)
    model.compile(loss='mse',optimizer=adam)
    #create model file if not present
    if not os.path.isfile(loss_file_path): #確定路徑有無權重
        model.save_weights('model.h5') # 沒的話先存第一次檔
    print("We finish building the model")
    return model

下面可看到模型從卷積後到平展層展開,接著連結隱藏層。
https://ithelp.ithome.com.tw/upload/images/20191002/20121110UmbkNNeKqZ.png

程式碼實作

建立DQN modelunit4_test_DQN

結語

如果有玩過classification的,會覺得上面的model非常easy~差別在主程序有寫Q估計跟Q現實,在那才能分辨Q-learning跟分類的差異。好了我們明天就來體驗主程序訓練的程式碼吧!


上一篇
Day16 損失&優化函數
下一篇
Day18 Dion train(上)
系列文
人工智慧(RL系列) 完爆遊戲30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言